package com.morristaedt.mirror;
import android.content.Context;
import android.content.Intent;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrixColorFilter;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.morristaedt.mirror.configuration.ConfigurationSettings;
import com.morristaedt.mirror.modules.BirthdayModule;
import com.morristaedt.mirror.modules.CalendarModule;
import com.morristaedt.mirror.modules.ChoresModule;
import com.morristaedt.mirror.modules.CountdownModule;
import com.morristaedt.mirror.modules.DayModule;
import com.morristaedt.mirror.modules.ForecastModule;
import com.morristaedt.mirror.modules.MoodModule;
import com.morristaedt.mirror.modules.NewsModule;
import com.morristaedt.mirror.modules.XKCDModule;
import com.morristaedt.mirror.modules.YahooFinanceModule;
import com.morristaedt.mirror.receiver.AlarmReceiver;
import com.morristaedt.mirror.requests.YahooStockResponse;
import com.morristaedt.mirror.utils.WeekUtil;
import com.squareup.picasso.Picasso;
import java.lang.ref.WeakReference;
public class MirrorActivity extends ActionBarActivity {
@NonNull
private ConfigurationSettings mConfigSettings;
private TextView mBirthdayText;
private TextView mDayText;
private TextView mWeatherSummary;
private TextView mHelloText;
private TextView mBikeTodayText;
private TextView mStockText;
private TextView mMoodText;
private View mWaterPlants;
private View mGroceryList;
private ImageView mXKCDImage;
private MoodModule mMoodModule;
private TextView mNewsHeadline;
private TextView mCalendarTitleText;
private TextView mCalendarDetailsText;
private TextView mCountdownText;
private XKCDModule.XKCDListener mXKCDListener = new XKCDModule.XKCDListener() {
@Override
public void onNewXKCDToday(String url) {
if (TextUtils.isEmpty(url)) {
mXKCDImage.setVisibility(View.GONE);
} else {
Picasso.with(MirrorActivity.this).load(url).into(mXKCDImage);
mXKCDImage.setVisibility(View.VISIBLE);
}
}
};
private YahooFinanceModule.StockListener mStockListener = new YahooFinanceModule.StockListener() {
@Override
public void onNewStockPrice(YahooStockResponse.YahooQuoteResponse quoteResponse) {
if (quoteResponse == null) {
mStockText.setVisibility(View.GONE);
} else {
mStockText.setVisibility(View.VISIBLE);
mStockText.setText("$" + quoteResponse.symbol + " $" + quoteResponse.LastTradePriceOnly);
}
}
};
private ForecastModule.ForecastListener mForecastListener = new ForecastModule.ForecastListener() {
@Override
public void onWeatherToday(String weatherToday) {
if (!TextUtils.isEmpty(weatherToday)) {
mWeatherSummary.setVisibility(View.VISIBLE);
mWeatherSummary.setText(weatherToday);
}
}
@Override
public void onShouldBike(boolean showToday, boolean shouldBike) {
if (mConfigSettings.showBikingHint()) {
mBikeTodayText.setVisibility(showToday ? View.VISIBLE : View.GONE);
mBikeTodayText.setText(shouldBike ? R.string.bike_today : R.string.no_bike_today);
} else {
mBikeTodayText.setVisibility(View.GONE);
}
}
};
private NewsModule.NewsListener mNewsListener = new NewsModule.NewsListener() {
@Override
public void onNewNews(String headline) {
if (TextUtils.isEmpty(headline)) {
mNewsHeadline.setVisibility(View.GONE);
} else {
mNewsHeadline.setVisibility(View.VISIBLE);
mNewsHeadline.setText(headline);
mNewsHeadline.setSelected(true);
}
}
};
private MoodModule.MoodListener mMoodListener = new MoodModule.MoodListener() {
@Override
public void onShouldGivePositiveAffirmation(final String affirmation) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mMoodText.setVisibility(affirmation == null ? View.GONE : View.VISIBLE);
mMoodText.setText(affirmation);
}
});
}
};
private CalendarModule.CalendarListener mCalendarListener = new CalendarModule.CalendarListener() {
@Override
public void onCalendarUpdate(String title, String details) {
mCalendarTitleText.setVisibility(title != null ? View.VISIBLE : View.GONE);
mCalendarTitleText.setText(title);
mCalendarDetailsText.setVisibility(details != null ? View.VISIBLE : View.GONE);
mCalendarDetailsText.setText(details);
//Make marquee effect work for long text
mCalendarTitleText.setSelected(true);
mCalendarDetailsText.setSelected(true);
}
};
private CountdownModule.CountdownListener mCountdownListener = new CountdownModule.CountdownListener() {
@Override
public void onCountdownUpdate(final String timeLeft) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCountdownText.setVisibility(View.VISIBLE);
mCountdownText.setText(timeLeft);
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mirror);
mConfigSettings = new ConfigurationSettings(this);
AlarmReceiver.startMirrorUpdates(this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView.setSystemUiVisibility(uiOptions);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mBirthdayText = (TextView) findViewById(R.id.birthday_text);
mDayText = (TextView) findViewById(R.id.day_text);
mWeatherSummary = (TextView) findViewById(R.id.weather_summary);
mHelloText = (TextView) findViewById(R.id.hello_text);
mWaterPlants = findViewById(R.id.water_plants);
mGroceryList = findViewById(R.id.grocery_list);
mBikeTodayText = (TextView) findViewById(R.id.can_bike);
mStockText = (TextView) findViewById(R.id.stock_text);
mMoodText = (TextView) findViewById(R.id.mood_text);
mXKCDImage = (ImageView) findViewById(R.id.xkcd_image);
mNewsHeadline = (TextView) findViewById(R.id.news_headline);
mCalendarTitleText = (TextView) findViewById(R.id.calendar_title);
mCalendarDetailsText = (TextView) findViewById(R.id.calendar_details);
mCountdownText = (TextView) findViewById(R.id.countdown_text);
if (mConfigSettings.invertXKCD()) {
//Negative of XKCD image
float[] colorMatrixNegative = {
-1.0f, 0, 0, 0, 255, //red
0, -1.0f, 0, 0, 255, //green
0, 0, -1.0f, 0, 255, //blue
0, 0, 0, 1.0f, 0 //alpha
};
ColorFilter colorFilterNegative = new ColorMatrixColorFilter(colorMatrixNegative);
mXKCDImage.setColorFilter(colorFilterNegative); // not inverting for now
}
setViewState();
}
@Override
protected void onPause() {
super.onPause();
if (mMoodModule != null) {
mMoodModule.release();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setViewState();
}
private void colorTextViews(ViewGroup mview){
for (int i = 0; i < mview.getChildCount(); i++) {
View view = mview.getChildAt(i);
if (view instanceof ViewGroup)
colorTextViews((ViewGroup) view);
else if (view instanceof TextView) {
((TextView) view).setTextColor(mConfigSettings.getTextColor());
}
}
}
private void setViewState() {
colorTextViews((ViewGroup) findViewById(R.id.main_layout));
String birthday = BirthdayModule.getBirthday();
if (TextUtils.isEmpty(birthday)) {
mBirthdayText.setVisibility(View.GONE);
} else {
mBirthdayText.setVisibility(View.VISIBLE);
mBirthdayText.setText(getString(R.string.happy_birthday, birthday));
}
mDayText.setText(DayModule.getDay());
// mHelloText.setText(TimeModule.getTimeOfDayWelcome(getResources())); // not in current design
mWaterPlants.setVisibility(ChoresModule.waterPlantsToday() ? View.VISIBLE : View.GONE);
mGroceryList.setVisibility(ChoresModule.makeGroceryListToday() ? View.VISIBLE : View.GONE);
// Get the API key for whichever weather service API key is available
// These should be declared as a string in xml
int forecastApiKeyRes = getResources().getIdentifier("dark_sky_api_key", "string", getPackageName());
int openWeatherApiKeyRes = getResources().getIdentifier("open_weather_api_key", "string", getPackageName());
if (forecastApiKeyRes != 0) {
ForecastModule.getForecastIOHourlyForecast(getString(forecastApiKeyRes), mConfigSettings.getForecastUnits(), mConfigSettings.getLatitude(), mConfigSettings.getLongitude(), mForecastListener);
} else if (openWeatherApiKeyRes != 0) {
ForecastModule.getOpenWeatherForecast(getString(openWeatherApiKeyRes), mConfigSettings.getForecastUnits(), mConfigSettings.getLatitude(), mConfigSettings.getLongitude(), mForecastListener);
}
if (mConfigSettings.showNewsHeadline()) {
NewsModule.getNewsHeadline(mNewsListener);
} else {
mNewsHeadline.setVisibility(View.GONE);
}
if (mConfigSettings.showXKCD()) {
XKCDModule.getXKCDForToday(mXKCDListener);
} else {
mXKCDImage.setVisibility(View.GONE);
}
if (mConfigSettings.showNextCalendarEvent()) {
CalendarModule.getCalendarEvents(this, mCalendarListener);
} else {
mCalendarTitleText.setVisibility(View.GONE);
mCalendarDetailsText.setVisibility(View.GONE);
}
if (mConfigSettings.showStock() && (ConfigurationSettings.isDemoMode() || WeekUtil.isWeekdayAfterFive())) {
YahooFinanceModule.getStockForToday(mConfigSettings.getStockTickerSymbol(), mStockListener);
} else {
mStockText.setVisibility(View.GONE);
}
if (mConfigSettings.showMoodDetection()) {
mMoodModule = new MoodModule(new WeakReference<Context>(this));
mMoodModule.getCurrentMood(mMoodListener);
} else {
mMoodText.setVisibility(View.GONE);
}
if (mConfigSettings.showCountdown()){
CountdownModule.getTimeRemaining(mConfigSettings.getCountdownEnd(), mCountdownListener);
} else {
mCountdownText.setVisibility(View.GONE);
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
AlarmReceiver.stopMirrorUpdates(this);
Intent intent = new Intent(this, SetUpActivity.class);
startActivity(intent);
}
}